package cn.map.linkedhashmap;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/*
    总结: 在List转Map的过程中：
        如果我们对Map中的顺序没要求，我们可以通过stream流将List转换为默认的HMap即可
        如果我们对Map中的顺序有要求，我们可以通过stream流将List转换为LinkedHashMap才行
* */
public class Demo03 {
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User(1, "张三", "我是张三01"));
        list.add(new User(2, "张三", "我是张三02"));
        list.add(new User(3, "李四", "我是李四01"));
        list.add(new User(4, "李四", "我是李四02"));
        list.add(new User(5, "王五", "我是王五01"));
        list.add(new User(6, "王五", "我是王五02"));
        //通过名字进行分组，如果名字重复的话只取第一个：List转Map<String, User>
        Map<String, User> map1 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1));
        printMap(map1);
        //通过名字进行分组，如果名字重复的话就分组成List：List转Map<String, List<User>>
        Map<String, List<User>> map2 = list.stream().collect(Collectors.groupingBy(User::getName));
        printMapList(map2);
        //通过名字进行分组，如果名字重复的话只取第一个：List转LinkedHashMap<String, User>
        Map<String, User> map3 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1, LinkedHashMap::new));
        printMap(map3);
        //通过名字进行分组，如果名字重复的话就分组成List：List转LinkedHashMap<String, List<User>>
        Map<String, List<User>> map4 = list.stream().collect(Collectors.groupingBy(User::getName, LinkedHashMap::new, Collectors.toList()));
        printMapList(map4);
    }

    private static void printMapList(Map<String, List<User>> map){
        map.forEach((k,v)->{
            System.out.println(k);
            v.forEach(System.out::println);
        });
        System.out.println();
    }

    private static void printMap(Map<String, User> map){
        map.forEach((k,v)->System.out.println(k+" : "+v));
        System.out.println();
    }
}
